package edu.algo3.algoThief.dao;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.jdom2.Element;

public class Archivo extends repositorioXML {

	private static String nombreDocumentoXML = "datos/pistas/xml/archivados.xml";
	
	// No se si esta bien o no pero aca he intentado hacer de tal forma que solo se cargan una vez los datos de un jugador : hay un unico parse.
	// Las variables son directamente utilizadas por repositorioXML por, siendo String guardadas en xml, no van a estar modificada independientemente del resto del package.
	
	private static String jugadorNombre = "";
	private static String jugadorArrestos;
	private static String jugadorPistaActual;
	private static String jugadorNumeroDeEdificiosVisitados;
	private static String jugadorYaHeridoConCuchillo;
	private static String estaEnCiudadIncorrecta;
	private static String jugadorEdificioActual;
	private static String paisActual;
	private static String tiempo;
	private static String ordenDeArrestoApellido;
	private static String ordenDeArrestoSexo;
	private static String ordenDeArrestoSenia;
	private static String ordenDeArrestoCabello;
	private static String ordenDeArrestoVehiculo;
	private static String ordenDeArrestoHobby;
	private static String ladronApellido;
	private static String objetoRobadoNombre;
	private static ArrayList<String> paisesDeEscape;
	
	// Getters
	
	protected static int getJugadorArrestos(String jugadorNombre)
	{
		if(!Archivo.jugadorNombre.equals(jugadorNombre))
		{
			cargarLosDatosSobre(jugadorNombre);
		}
		return Integer.parseInt(jugadorArrestos);
	}
	
	protected static String getJugadorPistaActual(String jugadorNombre)
	{
		if(!Archivo.jugadorNombre.equals(jugadorNombre))
		{
			cargarLosDatosSobre(jugadorNombre);
		}
		return jugadorPistaActual;
	}
	
	protected static int getJugadorNumeroDeEdificiosVisitados(String jugadorNombre)
	{
		if(!Archivo.jugadorNombre.equals(jugadorNombre))
		{
			cargarLosDatosSobre(jugadorNombre);
		}
		return Integer.parseInt(jugadorNumeroDeEdificiosVisitados);
	}
	
	protected static Boolean getEstaEnCiudadIncorrecta(String jugadorNombre)
	{
		if(!Archivo.jugadorNombre.equals(jugadorNombre))
		{
			cargarLosDatosSobre(jugadorNombre);
		}
		return Boolean.valueOf(estaEnCiudadIncorrecta);
	}
	
	protected static Boolean getJugadorYaHeridoConCuchillo(String jugadorNombre)
    {
        if(!Archivo.jugadorNombre.equals(jugadorNombre))
        {
            cargarLosDatosSobre(jugadorNombre);
        }
        return Boolean.valueOf(jugadorYaHeridoConCuchillo);
	}
	
	protected static String getJugadorEdificioActual(String jugadorNombre)
	{
		if(!Archivo.jugadorNombre.equals(jugadorNombre))
		{
			cargarLosDatosSobre(jugadorNombre);
		}
		return jugadorEdificioActual;
	}
	
	protected static String getPaisActual(String jugadorNombre)
	{
		if(!Archivo.jugadorNombre.equals(jugadorNombre))
		{
			cargarLosDatosSobre(jugadorNombre);
		}
		return paisActual;
	}
	
	protected static int getTiempo(String jugadorNombre)
	{
		if(!Archivo.jugadorNombre.equals(jugadorNombre))
		{
			cargarLosDatosSobre(jugadorNombre);
		}
		return Integer.parseInt(tiempo);
	}
	
	protected static String getOrdenDeArrestoApellido(String jugadorNombre)
	{
		if(!Archivo.jugadorNombre.equals(jugadorNombre))
		{
			cargarLosDatosSobre(jugadorNombre);
		}
		return ordenDeArrestoApellido;
	}
	
	protected static String getOrdenDeArrestoSexo(String jugadorNombre)
	{
		if(!Archivo.jugadorNombre.equals(jugadorNombre))
		{
			cargarLosDatosSobre(jugadorNombre);
		}
		return ordenDeArrestoSexo;
	}
	
	protected static String getOrdenDeArrestoSenia(String jugadorNombre)
	{
		if(!Archivo.jugadorNombre.equals(jugadorNombre))
		{
			cargarLosDatosSobre(jugadorNombre);
		}
		return ordenDeArrestoSenia;
	}
	
	protected static String getOrdenDeArrestoCabello(String jugadorNombre)
	{
		if(!Archivo.jugadorNombre.equals(jugadorNombre))
		{
			cargarLosDatosSobre(jugadorNombre);
		}
		return ordenDeArrestoCabello;
	}
	
	protected static String getOrdenDeArrestoVehiculo(String jugadorNombre)
	{
		if(!Archivo.jugadorNombre.equals(jugadorNombre))
		{
			cargarLosDatosSobre(jugadorNombre);
		}
		return ordenDeArrestoVehiculo;
	}
	
	protected static String getOrdenDeArrestoHobby(String jugadorNombre)
	{
		if(!Archivo.jugadorNombre.equals(jugadorNombre))
		{
			cargarLosDatosSobre(jugadorNombre);
		}
		return ordenDeArrestoHobby;
	}
	
	protected static String getLadronApellido(String jugadorNombre)
	{
		if(!Archivo.jugadorNombre.equals(jugadorNombre))
		{
			cargarLosDatosSobre(jugadorNombre);
		}
		return ladronApellido;
	}
	
	protected static String getObjetoRobadoNombre(String jugadorNombre)
	{
		if(!Archivo.jugadorNombre.equals(jugadorNombre))
		{
			cargarLosDatosSobre(jugadorNombre);
		}
		return objetoRobadoNombre;
	}
	
	protected static ArrayList<String> getPaisesDeEscape(String jugadorNombre)
	{
		if(!Archivo.jugadorNombre.equals(jugadorNombre))
		{
			cargarLosDatosSobre(jugadorNombre);
		}
		return paisesDeEscape;
	}
	
	// Metodos
	
	protected static void cargarLosDatosSobre(String jugadorNombre)
	{
		parseDocumento(nombreDocumentoXML);
		
		List<Element> listaDeJugadores = racine.getChildren("jugador");
		Iterator<Element> i1 = listaDeJugadores.iterator();
		while(i1.hasNext())
		{
			Element jugador = (Element)i1.next();
			
			if(jugador.getChild("nombre").getText().equals(jugadorNombre))
			{
				Archivo.jugadorNombre = jugador.getChild("nombre").getText();
				Archivo.jugadorArrestos = jugador.getChild("arrestos").getText();
				Archivo.jugadorPistaActual = jugador.getChild("pistaActual").getText();
				Archivo.jugadorNumeroDeEdificiosVisitados = jugador.getChild("numeroDeEdificiosVisitados").getText();
				Archivo.jugadorYaHeridoConCuchillo = jugador.getChild("yaHeridoConCuchillo").getText();
				Archivo.estaEnCiudadIncorrecta = jugador.getChild("estaEnCiudadIncorrecta").getText();
				Archivo.jugadorEdificioActual = jugador.getChild("edificioActual").getText();
				Archivo.paisActual = jugador.getChild("paisActual").getText();
				Archivo.tiempo = jugador.getChild("tiempo").getText();
				
				Element ordenDeArresto = jugador.getChild("ordenDeArresto");
				Archivo.ordenDeArrestoApellido = ordenDeArresto.getChildText("apellido");
				Archivo.ordenDeArrestoSexo = ordenDeArresto.getChildText("sexo");
				Archivo.ordenDeArrestoSenia = ordenDeArresto.getChildText("senia");
				Archivo.ordenDeArrestoCabello = ordenDeArresto.getChildText("cabello");
				Archivo.ordenDeArrestoVehiculo = ordenDeArresto.getChildText("vehiculo");
				Archivo.ordenDeArrestoHobby = ordenDeArresto.getChildText("hobby");
				
				Element ladron = jugador.getChild("ladron");
				Archivo.ladronApellido = ladron.getChildText("apellido");
				
				Element objetoRobado = jugador.getChild("objetoRobado");
				Archivo.objetoRobadoNombre = objetoRobado.getChildText("objetoRobadoNombre");
				
				ArrayList<String> paises = new ArrayList<String>();
				Element paisesDeEscape = jugador.getChild("paisesDeEscape");
				List<Element> listaDePaises = paisesDeEscape.getChildren("pais");
				Iterator<Element> i2 = listaDePaises.iterator();
				while(i2.hasNext())
				{
					Element pais = (Element)i2.next();
					paises.add(pais.getText());
				}
				Archivo.paisesDeEscape = paises;
			}
			
		}
			/*
			List<Element> listaDeSospechosos = racine.getChildren("sospechoso");
			Iterator<Element> i1 = listaDeSospechosos.iterator();
			while(i1.hasNext() & resultado.equals("No Buscado"))
			{
				Element sospechoso = (Element)i1.next();
				List<Element> listaDeCaracteristicas = sospechoso.getChildren();
				if( (listaDeCaracteristicas.get(0)).getText().equals(sospechosoApellido) )
				{
					Iterator<Element> i2 = listaDeCaracteristicas.iterator();
					while(i2.hasNext())
					{
						Element caracteristica = (Element)i2.next();
						datos.add(caracteristica.getText());
					}
				resultado = "buscado";
				}
			}*/
	}
	
	// Metodos guardar / borrar
	
	protected static void archivar(
			String jugadorNombre,
			String jugadorArrestos,
			String jugadorPistaActual,
			String jugadorNumeroDeEdificiosVisitados,
			String jugadorYaHeridoConCuchillo,
			String estaEnCiudadIncorrecta,
			String jugadorEdificioActual,
			String paisActual,
			String tiempo,
			String ordenDeArrestoApellido,
			String ordenDeArrestoSexo,
			String ordenDeArrestoSenia,
			String ordenDeArrestoCabello,
			String ordenDeArrestoVehiculo,
			String ordenDeArrestoHobby,
			String ladronApellido,
			String objetoRobadoNombre,
			ArrayList<String> paisesDeEscapee)
	{
		
		if(getListaNombresJugadores().contains(jugadorNombre))
		{
			borrarPartida(jugadorNombre);
		}
		
		parseDocumento(nombreDocumentoXML);
		
		Element jugador = new Element("jugador");
		racine.addContent(jugador);
		
		jugador.addContent(new Element("nombre").setText(jugadorNombre));
		jugador.addContent(new Element("arrestos").setText(jugadorArrestos));
		jugador.addContent(new Element("pistaActual").setText(jugadorPistaActual));
		jugador.addContent(new Element("numeroDeEdificiosVisitados").setText(jugadorNumeroDeEdificiosVisitados));
		jugador.addContent(new Element("yaHeridoConCuchillo").setText(jugadorYaHeridoConCuchillo));
		jugador.addContent(new Element("estaEnCiudadIncorrecta").setText(estaEnCiudadIncorrecta));
		jugador.addContent(new Element("edificioActual").setText(jugadorEdificioActual));
		jugador.addContent(new Element("paisActual").setText(paisActual));
		jugador.addContent(new Element("tiempo").setText(tiempo));
		
		Element ordenDeArresto = new Element("ordenDeArresto");
		jugador.addContent(ordenDeArresto);
		
		ordenDeArresto.addContent(new Element("apellido").setText(ordenDeArrestoApellido));
		ordenDeArresto.addContent(new Element("sexo").setText(ordenDeArrestoSexo));
		ordenDeArresto.addContent(new Element("senia").setText(ordenDeArrestoSenia));
		ordenDeArresto.addContent(new Element("cabello").setText(ordenDeArrestoCabello));
		ordenDeArresto.addContent(new Element("vehiculo").setText(ordenDeArrestoVehiculo));
		ordenDeArresto.addContent(new Element("hobby").setText(ordenDeArrestoHobby));
		
		Element ladron = new Element("ladron");
		jugador.addContent(ladron);
		
		ladron.addContent(new Element("apellido").setText(ladronApellido));
		
		Element objetoRobado = new Element("objetoRobado");
		jugador.addContent(objetoRobado);
		
		objetoRobado.addContent(new Element("objetoRobadoNombre").setText(objetoRobadoNombre));
		
		Element paisesDeEscape = new Element("paisesDeEscape");
		jugador.addContent(paisesDeEscape);
		
		Iterator<String> i = paisesDeEscapee.iterator();
		while(i.hasNext())
		{
			paisesDeEscape.addContent(new Element("pais").setText(i.next()));
		}

		archivarEn(nombreDocumentoXML);
		
		Archivo.jugadorNombre=""; // se hace eso para estar seguro de no cargar los datos ancianos del jugador
	}
	
	protected static void borrarPartida(String nombreJugador)
	{
		parseDocumento(nombreDocumentoXML);
		
	    List<Element> listaJugadores = racine.getChildren("jugador");
	    Iterator<Element> i = listaJugadores.iterator();
	    boolean borrado = false;
	    
	    while(borrado == false & i.hasNext())
	    {
	    	Element jugador = (Element)i.next();
	       
	    	if(jugador.getChild("nombre").getText().equals(nombreJugador))
	    	{
	    			racine.removeContent(jugador);
	    			borrado = true;
	    	}
	    }
	    
	    archivarEn(nombreDocumentoXML);
	}
	
	protected static ArrayList<String> getListaNombresJugadores()
	{
		parseDocumento(nombreDocumentoXML);
		
		ArrayList<String> listaNombresJugadores = new ArrayList<String>();
	    List<Element> listaJugadores = racine.getChildren("jugador");
	    Iterator<Element> i = listaJugadores.iterator();
	    while(i.hasNext())
	    {
	    	Element jugador = (Element)i.next();
	    	listaNombresJugadores.add(jugador.getChild("nombre").getText());
	    }
		return listaNombresJugadores;
	}
	
}
